      1  public class Palindromes

      2  {

      3     public static void main(String[] args)

      4     {

      5        String sentence1 = "Madam, I'm Adam!";

      6        System.out.println(sentence1);

      7        System.out.println("Palindrome: " + isPalindrome(sentence1));

      8        String sentence2 = "Sir, I'm Eve!";

      9        System.out.println(sentence2);

     10        System.out.println("Palindrome: " + isPalindrome(sentence2));

     11     }

     12

     13     /**

     14        Tests whether a text is a palindrome.

     15        @param text a string that is being checked

     16        @return true if text is a palindrome, false otherwise

     17     */

     18     public static boolean isPalindrome(String text)

     19     {

     20        return isPalindrome(text, 0, text.length() - 1);

     21     }

     22

     23     /**

     24        Tests whether a substring is a palindrome.

     25        @param text a string that is being checked

     26        @param start the index of the first character of the substring

     27        @param end the index of the last character of the substring

     28        @return true if the substring is a palindrome

     29     */

     30     public static boolean isPalindrome(String text, int start, int end)

     31     {

     32        // Separate case for substrings of length 0 and 1.

     33        if (start >= end) { return true; }

     34        else

     35        {

     36           // Get first and last characters, converted to lowercase.

     37           char first = Character.toLowerCase(text.charAt(start));

     38           char last = Character.toLowerCase(text.charAt(end));

     39           if (Character.isLetter(first) && Character.isLetter(last))

     40           {

     41              if (first == last)

     42              {

     43                 // Test substring that doesn’t contain the matching letters.

     44                 return isPalindrome(text, start + 1, end - 1);

     45              }

     46              else

     47              {

     48                 return false;

     49              }

     50           }

     51           else if (!Character.isLetter(last))

     52           {

     53              // Test substring that doesn’t contain the last character.

     54              return isPalindrome(text, start, end - 1);

     55           }

     56           else

     57           {

     58              // Test substring that doesn’t contain the first character.

     59              return isPalindrome(text, start + 1, end);

     60           }

     61        }

     62     }

     63  }